from flask import current_app, jsonify
from flask import render_template
from flask import request
from flask import session

from info import constants
from info.models import User, News, Category
from info.response_code import RET
from . import index_blu


# 新闻列表
@index_blu.route("/news_list",methods=["GET"])
def get_news_list():
    # 根据新闻分类的id获取新闻资讯
    # 1. 获取参数[cid,page,per_page] 新闻分类id， 页数， 每页有多少条新闻，默认为10条
    cid = request.args.get("cid")
    page = request.args.get("p",1)
    per_page = request.args.get("per_page",constants.HOME_PAGE_MAX_NEWS)
    # 2. 校验参数
    if not cid:
        return jsonify(errno=RET.PARAMERR, errmsg="参数错误")
    # 获取新闻列表数据  直接查询新闻分类的id就可以判断了  desc()倒序 按时间倒序查找
    # paginate的返回值是一个分页对象，提供了以下常用的几个参数：
    # items当前页面中查询出来的所有数据
    # pages总页数
    # page当前页码
            #  paginate() 获取分页数据
    try:
        # 如果查询的是最新的新闻资讯，则获取的必须是所有分类下的信息
        filters = []
        cid = int(cid)
        page = int(page)
        per_page = int(per_page)

        if cid != 1:     #分类1里面存放的是所有分类里面的最新新闻
            # 当分类id不是1的时候 添加其分类id进列表
            # 也就是当点击浏览其他分类的新闻时，只显示它里面的新闻内容跟页码
            filters.append(News.category_id==cid)
            # *filters 展开列表成员
        pagination=News.query.filter(*filters)\
            .order_by(News.create_time.desc())\
            .paginate(page,per_page,False)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.PARAMERR, errmsg="无效参数")

    page = pagination.page
    # 表示获取当前页面的所以数据，是一个list列表数据，成员是news模型表对象
    news_list = pagination.items
    pages = pagination.pages

    # 数据重构[把数据的格式转化成我们想要的字典型]
    news_li = []
    for news in news_list:  # to_basic_dict()在模型类里面有这个 方法
        news_li.append(news.to_basic_dict()) # 把news_li这个对象转化成字典结构

    return jsonify(errno=RET.OK,errmsg="OK",
                   cid=cid, # 分类id
                   current_page=page, #当前页码
                   news_list=news_li, #
                   )

# 2. 通过蓝图对象注册视图路由
@index_blu.route("/")
def index():
    # 查看当前已经登陆的用户
    user_id=session.get("user_id")

    user = None


    if user_id:
        # 根据user_id到数据库中查询用户信息
        try:
            user = User.query.get(user_id)
        except Exception as e:
            current_app.logger.error(e)

    # 查询点击排行的资讯列表
    # News.clicks.desc()根据新闻的点击率多少和新旧进行倒序排行(意思就是从点击量多到少)
    # limit()查找排行展示的最多数量  数量CLICK_RANK_MAX_NEWS
    news_list = None
    try:
        news_list = News.query.order_by(News.clicks.desc()).limit(constants.CLICK_RANK_MAX_NEWS)
    except Exception as e:
        current_app.logger.error(e)

    # 查询获取新闻分类的数据
    categories = Category.query.all()

         # 把user,news_list一起传到模板页面去 到时候会用到
    return render_template('news/index.html',
                           user=user,
                           news_list=news_list,
                           categories=categories)
    # try:
    #     1 / 0
    # except Exception as e:
    #     logging.error(e)

# 在浏览器访问网站的时候，都会自动到服务器的根目录下访问一个 favicon.ico的网站图标
@index_blu.route("/favicon.ico")
def favicon():
    # send_static_file是系统访问静态文件所调用的方法,可以读取静态资源目录下文件内容
    return current_app.send_static_file("news/favicon.ico")


















































